﻿/*
 * Copyright (c) 2009, Thiago M. Sayao <thiago.sayao@gmail.com>
 * All rights reserved.
 * 
 * Redistribution and use in source and binary forms, with or without 
 * modification, are permitted provided that the following conditions are met:
 *  * Redistributions of source code must retain the above copyright notice, 
 *    this list of conditions and the following disclaimer.
 *  * Redistributions in binary form must reproduce the above copyright notice,
 *    this list of conditions and the following disclaimer in the documentation
 *    and/or other materials provided with the distribution.
 *  * Neither the name of the author nor the names of its contributors may be 
 *    used to endorse or promote products derived from this software without 
 *    specific prior written permission.
 * 
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 
 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 
 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 
 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 
 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 
 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 
 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 
 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 
 * POSSIBILITY OF SUCH DAMAGE.
 */

using System;
using System.Web.Caching;
using DotNetBurner.Core;
using DotNetBurner.Web.Settings;

namespace DotNetBurner.Web
{
    public static class CacheExtensions
    {
        public static bool TryGet<T> (this Cache cache, string key, out T value)
        {
            var obj = cache.Get (key);

            if (obj != null)
            {
                value = (T)obj;
                return true;
            }

            value = default(T);

            return false;
        }

        public static void CacheData<T> (this Cache cache, string key, string profileKey, T data)
        {
            var dc = DataCacheSettings.GetDataCacheProfile (profileKey);

            if (dc == null)
                throw new ArgumentException ("Data cache profile {0} not found".FormatWith (profileKey));

            if (data.Equals(default(T)))
                return;

            if (dc.Enabled)
            {
                if (dc.UseDependency)
                {
                    if (string.IsNullOrEmpty(dc.SqlDependency))
                        throw new InvalidOperationException("sqlDependency must be set when dependency is enabled.");

                    var sqlDepInfo = dc.SqlDependency.Split(new char[] {':'}, StringSplitOptions.RemoveEmptyEntries);

                    if (sqlDepInfo.Length != 2)
                        throw new InvalidOperationException("sqlDependency option must obey the Database:Table format");

                    cache.Insert (key, 
                                  data, 
                                  new SqlCacheDependency(sqlDepInfo[0], sqlDepInfo[1]),
                                  Cache.NoAbsoluteExpiration,
                                  TimeSpan.FromMinutes(dc.Duration),
                                  dc.Priority,
                                  null);
                }
                else
                {
                    cache.Insert (key, 
                                  data, 
                                  null,
                                  Cache.NoAbsoluteExpiration,
                                  TimeSpan.FromMinutes (dc.Duration),
                                  dc.Priority,
                                  null);
                }
            }
        }
    }
}
